package Persistencia;

import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import Negocio.Pessoa;

public class PessoaDAO extends BaseDAO {

    ArrayList<Pessoa> pessoas;
    private PreparedStatement stIncluir;
    private PreparedStatement stEditar;
    private PreparedStatement stRemover;
    private PreparedStatement stCodPessoa;
    private PreparedStatement stPessoas;

    public PessoaDAO() throws IOException {
        super();
        Connection con = getConexao();
        try {
            stIncluir = con.prepareStatement("INSERT INTO pessoas (nome, endereco, numero, complemento, bairro, cidade, uf, cep, telefone, celular, rg, cpf, dt_nasc, email, obs, dt_cada) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            stEditar = con.prepareStatement("UPDATE pessoas SET nome = ?, endereco = ?, numero = ?, complemento = ?, bairro = ?, cidade = ?, uf = ?, cep = ?, telefone = ?, celular = ?, rg = ?, cpf = ?, dt_nasc = ?, email = ?, obs = ? WHERE pessoa_id = ?");
            stCodPessoa = con.prepareStatement("SELECT pessoa_id FROM pessoas");
            stPessoas = con.prepareStatement("SELECT * FROM pessoas WHERE ((pessoa_id = ?) OR (nome LIKE ?))");
            stRemover = con.prepareStatement("DELETE * FROM agenda WHERE nome=?");
        } catch (SQLException e) {
            throw new IOException("Nao foi possivel criar as consultas: " + e.getMessage());
        }
    }

    public void incluir(Pessoa p) throws IOException {
        try {
            stIncluir.setString(1, p.getNome());
            stIncluir.setString(2, p.getEndereco());
            stIncluir.setInt(3, p.getNumero());
            stIncluir.setString(4, p.getComplemento());
            stIncluir.setString(5, p.getBairro());
            stIncluir.setString(6, p.getCidade());
            stIncluir.setObject(7, p.getUf());
            stIncluir.setString(8, p.getCep());
            stIncluir.setString(9, p.getTelefone());
            stIncluir.setString(10, p.getCelular());
            stIncluir.setString(11, p.getRg());
            stIncluir.setString(12, p.getCpf());
            stIncluir.setDate(13, new java.sql.Date(p.getDtNasc().getTime()));
            stIncluir.setString(14, p.getEmail());
            stIncluir.setString(15, p.getObs());
            stIncluir.setDate(16, new java.sql.Date(p.getDtCada().getTime()));

            stIncluir.executeUpdate();
        } catch (SQLException e) {
            throw new IOException("Erro ao incluir: " + e.getMessage());
        }
    }
    
    public void editar(Pessoa pe) throws IOException {
        try {
            stEditar.setString(1, pe.getNome());
            stEditar.setString(2, pe.getEndereco());
            stEditar.setInt(3, pe.getNumero());
            stEditar.setString(4, pe.getComplemento());
            stEditar.setString(5, pe.getBairro());
            stEditar.setString(6, pe.getCidade());
            stEditar.setObject(7, pe.getUf());
            stEditar.setString(8, pe.getCep());
            stEditar.setString(9, pe.getTelefone());
            stEditar.setString(10, pe.getCelular());
            stEditar.setString(11, pe.getRg());
            stEditar.setString(12, pe.getCpf());
            stEditar.setDate(13, new java.sql.Date(pe.getDtNasc().getTime()));
            stEditar.setString(14, pe.getEmail());
            stEditar.setString(15, pe.getObs());
            stEditar.setInt(16, pe.getPessoaID());
            
            stEditar.executeUpdate();
        } catch (SQLException e) {
            throw new IOException("Erro ao editar: " + e.getMessage());
        }
    }

    public int ultimoCodCliente() throws SQLException {
        ResultSet cod = stCodPessoa.executeQuery();
        String resultado = null;
        while (cod.next()) {
            resultado = cod.getString("pessoa_id");
        }
        return Integer.parseInt(resultado) + 1;
    }

    public ArrayList buscaPessoa(Pessoa p) throws SQLException {
        pessoas = new ArrayList<Pessoa>();
        stPessoas.setString(1, p.getBusca());
        stPessoas.setString(2, "%" + p.getBusca() + "%");
        ResultSet resultado = stPessoas.executeQuery();

        while (resultado.next()) {
            Pessoa pe = new Pessoa();

            pe.setPessoaID(resultado.getInt("pessoa_id"));
            pe.setNome(resultado.getString("nome"));
            pe.setEndereco(resultado.getString("endereco"));
            pe.setNumero(resultado.getInt("numero"));
            pe.setComplemento(resultado.getString("complemento"));
            pe.setBairro(resultado.getString("bairro"));
            pe.setCidade(resultado.getString("cidade"));
            pe.setUf(resultado.getString("uf"));
            pe.setCep(resultado.getString("cep"));
            pe.setTelefone(resultado.getString("telefone"));
            pe.setCelular(resultado.getString("celular"));
            pe.setRg(resultado.getString("rg"));
            pe.setCpf(resultado.getString("cpf"));
            pe.setDtNasc(resultado.getDate("dt_nasc"));
            pe.setEmail(resultado.getString("email"));
            pe.setObs(resultado.getString("obs"));
            pe.setDtCada(resultado.getDate("dt_cada"));

            pessoas.add(pe);
        }
        return pessoas;
    }

    public Pessoa buscaPos(int pos) {
        return pessoas.get(pos);
    }
}